package biblioteca.modelos;

import biblioteca.excepciones.ExcepcionDeAplicacion;
import biblioteca.excepciones.ExcepcionDeBD;
import java.sql.SQLException;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import poo.biblioteca.bd.DBManager;

public class MdlMantenimiento {

    private Preferences preferencias;

    public MdlMantenimiento(Preferences preferencias) {
        this.preferencias = preferencias;
    }

    public DatosConexion getDatosConexion() {
        DatosConexion datosConexion = 
                new DatosConexion(preferencias.get("Host", "localhost"), 
                preferencias.get("Protocol", "3306"),
                preferencias.get("DBName", "biblioteca"),
                preferencias.get("User", "root"),
                preferencias.get("Password", ""));
         
        return datosConexion;
    }

    public void setPreferencia(String llave, String valor) throws ExcepcionDeAplicacion {
        try {
            preferencias.put(llave, valor);
            preferencias.flush();
        } catch (BackingStoreException ex) {
            throw new ExcepcionDeAplicacion("No se pudo registrar las preferencias "
                    + "del sistema");
        }
    }

    public void probarConexion(String connectionString) throws ExcepcionDeBD {
        DBManager dbm = DBManager.getInstancia();
        try {
            dbm.getConnection(connectionString).createStatement();
        } catch (SQLException ex) {
            throw new ExcepcionDeBD ("No se pudo realizar una conexión con "
                    + "la base de datos");
        }
    }

    public void crearDBManager(Preferences preferencias) throws ExcepcionDeBD {
        DBManager.setPreferencias (preferencias);
    }

    public boolean probarConexion() {
         
        try {
            DBManager dbm = DBManager.getInstancia();
            dbm.getConnection().createStatement();
            return true;
        } catch (ExcepcionDeBD ex) {
            return false;
        } catch (SQLException ex) {
            return false;
        }
        
    }

    public void setPreferenciasAplicacion(Preferences preferencias) throws ExcepcionDeAplicacion {
        try {
            DBManager.setPreferencias(preferencias);
        } catch (ExcepcionDeBD ex) {
            throw new ExcepcionDeAplicacion("No se tiene acceso a las "
                    + "preferencias de la aplicación");
        }
    }
    
    public class DatosConexion {

        private String connectionUrl;
        private String host;
        private String protocol;
        private String dbName;
        private String user;
        private String password;

        
        
        public DatosConexion() {
        }

        public String getConnectionUrl () {
            return "jdbc:mysql://" + host + ":" + protocol + "/"
                + dbName + "?"
                +"user="+ user + "&"
                + "password=" + password;
        }
        
        public DatosConexion(String host, String protocol, String dbName, String user, String password) {

            this.host = host;
            this.protocol = protocol;
            this.dbName = dbName;
            this.user = user;
            this.password = password;
        }

        public void setConnectionUrl(String connectionUrl) {
            this.connectionUrl = connectionUrl;
        }

        public String getHost() {
            return host;
        }

        public void setHost(String host) {
            this.host = host;
        }

        public String getProtocol() {
            return protocol;
        }

        public void setProtocol(String protocol) {
            this.protocol = protocol;
        }

        public String getDbName() {
            return dbName;
        }

        public void setDbName(String dbName) {
            this.dbName = dbName;
        }

        public String getUser() {
            return user;
        }

        public void setUser(String user) {
            this.user = user;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }
        
        
    }
}
